using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "AmmoDetails_", menuName = "游戏SO文件/武器/弹药详细信息文件")]
public class AmmoDetailsSO : ScriptableObject
{
    #region Header BASIC AMMO DETAILS

    [Space(10)]
    [Header("基本弹药详细信息")]

    #endregion

    #region Tooltip

    [Tooltip("弹药的名称")]

    #endregion

    public string ammoName;

    public bool isPlayerAmmo;

    #region Header AMMO SPRITE, PREFAB & MATERIALS

    [Space(10)]
    [Header("弹药精灵、预制件和材料")]

    #endregion

    #region Tooltip

    [Tooltip("用于弹药的精灵")]

    #endregion

    public Sprite ammoSprite;

    #region Tooltip

    [Tooltip("填充要用于弹药的预制件。 如果指定了多个预制件，则将从数组中选择一个随机预制件。 预制件可以是弹药模式 - 只要它符合 IFireable 接口即可。")]

    #endregion

    public GameObject[] ammoPrefabArray;

    #region Tooltip

    [Tooltip("用于弹药的材质")]

    #endregion

    public Material ammoMaterial;

    #region Tooltip

    [Tooltip("如果弹药在移动前应短暂“充能”，则设置弹药在发射后充电和释放前的保持时间（以秒为单位）")]

    #endregion

    public float ammoChargeTime = 0.1f;

    #region Tooltip

    [Tooltip("如果弹药有充能时间，则指定在充电时应使用什么材质来渲染弹药")]

    #endregion

    public Material ammoChargeMaterial;
    
    #region Header AMMO HIT EFFECT
    [Space(10)]
    [Header("弹药命中效果")]
    #endregion
    #region Tooltip
    [Tooltip("定义命中效果预制件参数的可编写脚本的对象")]
    #endregion
    public AmmoHitEffectSO ammoHitEffect;

    #region Header AMMO BASE PARAMETERS

    [Space(10)]
    [Header("弹药基础参数")]

    #endregion

    #region Tooltip

    [Tooltip("每种弹药造成的伤害")]

    #endregion

    public int ammoDamage = 1;

    #region Tooltip

    [Tooltip("弹药的最小速度 - 速度将是最小值和最大值之间的随机值")]

    #endregion

    public float ammoSpeedMin = 20f;

    #region Tooltip

    [Tooltip("弹药的最大速度 - 速度将是最小值和最大值之间的随机值")]

    #endregion

    public float ammoSpeedMax = 20f;

    #region Tooltip

    [Tooltip("弹药（或弹药模式）的射程，单位单位")]

    #endregion

    public float ammoRange = 20f;

    #region Tooltip

    [Tooltip("弹药模式的旋转速度（以度/秒为单位）")]

    #endregion

    public float ammoRotationSpeed = 1f;

    #region Header AMMO SPREAD DETAILS

    [Space(10)]
    [Header("弹药散布详细信息")]

    #endregion

    #region Tooltip

    [Tooltip("这是弹药的最小散布角。 更高的点差意味着更低的准确性。在最小值和最大值之间计算随机点差。")]

    #endregion

    public float ammoSpreadMin = 0f;

    #region Tooltip

    [Tooltip(" 这是弹药的最大散布角。 更高的点差意味着更低的准确性。在最小值和最大值之间计算随机点差。 ")]

    #endregion

    public float ammoSpreadMax = 0f;

    #region Header AMMO SPAWN DETAILS

    [Space(10)]
    [Header("弹药生成详细信息")]

    #endregion

    #region Tooltip

    [Tooltip("这是每次射击产生的最小弹药数量。在最小值和最大值之间生成随机数量的弹药。 ")]

    #endregion

    public int ammoSpawnAmountMin = 1;

    #region Tooltip

    [Tooltip("这是每次射击产生的最大弹药数量。在最小值和最大值之间生成随机数量的弹药。 ")]

    #endregion

    public int ammoSpawnAmountMax = 1;

    #region Tooltip

    [Tooltip("最小生成间隔时间。生成的弹药之间的时间间隔（以秒为单位）是指定最小值和最大值之间的随机值。")]

    #endregion

    public float ammoSpawnIntervalMin = 0f;

    #region Tooltip

    [Tooltip("最大生成间隔时间。生成的弹药之间的时间间隔（以秒为单位）是指定最小值和最大值之间的随机值。")]

    #endregion

    public float ammoSpawnIntervalMax = 0f;

    #region Header AMMO TRAIL DETAILS

    [Space(10)]
    [Header("弹药跟踪详细信息")]

    #endregion

    #region Tooltip

    [Tooltip("如果需要弹药追踪，则选择此选项，否则取消选择。 如果选择此选项，则应填充其余的弹药跟踪值。")]

    #endregion

    public bool isAmmoTrail = false;

    #region Tooltip

    [Tooltip("弹药跟踪寿命（以秒为单位）。")]

    #endregion

    public float ammoTrailTime = 3f;

    #region Tooltip

    [Tooltip("弹药跟踪材料。")]

    #endregion

    public Material ammoTrailMaterial;

    #region Tooltip

    [Tooltip("弹药轨迹的起始宽度。")]

    #endregion

    [Range(0f, 1f)]
    public float ammoTrailStartWidth;

    #region Tooltip

    [Tooltip("弹药轨迹的结束宽度")]

    #endregion

    [Range(0f, 1f)]
    public float ammoTrailEndWidth;

    #region Validation

#if UNITY_EDITOR
    // 验证输入的可编写脚本的对象详细信息
    private void OnValidate()
    {
        HelperUtilities.ValidateCheckEmptyString(this, nameof(ammoName), ammoName);
        HelperUtilities.ValidateCheckNullValue(this, nameof(ammoSprite), ammoSprite);
        HelperUtilities.ValidateCheckEnumerableValues(this, nameof(ammoPrefabArray), ammoPrefabArray);
        HelperUtilities.ValidateCheckNullValue(this, nameof(ammoMaterial), ammoMaterial);
        if (ammoChargeTime > 0)
            HelperUtilities.ValidateCheckNullValue(this, nameof(ammoChargeMaterial), ammoChargeMaterial);
        HelperUtilities.ValidateCheckPositiveValue(this, nameof(ammoDamage), ammoDamage, false);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(ammoSpeedMin), ammoSpeedMin, nameof(ammoSpeedMax),
            ammoSpeedMax, false);
        HelperUtilities.ValidateCheckPositiveValue(this, nameof(ammoRange), ammoRange, false);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(ammoSpreadMin), ammoSpreadMin, nameof(ammoSpreadMax),
            ammoSpreadMax, true);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(ammoSpawnAmountMin), ammoSpawnAmountMin,
            nameof(ammoSpawnAmountMax), ammoSpawnAmountMax, false);
        HelperUtilities.ValidateCheckPositiveRange(this, nameof(ammoSpawnIntervalMin), ammoSpawnIntervalMin,
            nameof(ammoSpawnIntervalMax), ammoSpawnIntervalMax, true);
        if (isAmmoTrail)
        {
            HelperUtilities.ValidateCheckPositiveValue(this, nameof(ammoTrailTime), ammoTrailTime, false);
            HelperUtilities.ValidateCheckNullValue(this, nameof(ammoTrailMaterial), ammoTrailMaterial);
            HelperUtilities.ValidateCheckPositiveValue(this, nameof(ammoTrailStartWidth), ammoTrailStartWidth, false);
            HelperUtilities.ValidateCheckPositiveValue(this, nameof(ammoTrailEndWidth), ammoTrailEndWidth, false);
        }
    }

#endif

    #endregion
}